import { defineStore } from 'pinia'
import { habitApi } from '@/api/habits'

// 默认数据，API失败时使用
const defaultHabits = [
  {
    id: 1,
    name: '晨跑',
    description: '每天早上跑步5公里',
    streak: 5,
    checkedToday: false
  },
  {
    id: 2,
    name: '阅读',
    description: '每天阅读1小时',
    streak: 3,
    checkedToday: true
  },
  {
    id: 3,
    name: '冥想',
    description: '每天冥想15分钟',
    streak: 10,
    checkedToday: false
  }
]

export const useHabitsStore = defineStore('habits', {
  state: () => ({
    habits: [...defaultHabits], // 直接初始化为默认数据
    loading: false,
    useLocalData: true  // 默认使用本地数据
  }),

  actions: {
    async fetchHabits() {
      this.loading = true
      try {
        // 尝试获取后端数据
        const data = await habitApi.getHabits()
        // 如果API调用成功，更新数据并标记使用远程数据
        this.habits = data
        this.useLocalData = false
      } catch (error) {
        console.warn('使用本地习惯数据', error)
        // 如果已有数据，不进行覆盖；否则使用默认数据
        if (this.habits.length === 0) {
          this.habits = [...defaultHabits]
        }
        this.useLocalData = true
      } finally {
        this.loading = false
      }
    },

    async createHabit(habitData) {
      try {
        if (this.useLocalData) {
          // 本地模式直接添加
          const newHabit = {
            ...habitData,
            id: Date.now(),
            streak: 0,
            checkedToday: false
          }
          this.habits.push(newHabit)
          return newHabit
        } else {
          const data = await habitApi.createHabit(habitData)
          this.habits.push(data)
          return data
        }
      } catch (error) {
        console.warn('创建习惯失败，使用本地模式', error)
        // 如果API失败，切换到本地模式
        this.useLocalData = true
        const newHabit = {
          ...habitData,
          id: Date.now(),
          streak: 0,
          checkedToday: false
        }
        this.habits.push(newHabit)
        return newHabit
      }
    },

    async updateHabit(id, habitData) {
      try {
        if (this.useLocalData) {
          // 本地模式直接更新
          const index = this.habits.findIndex(h => h.id === id)
          if (index !== -1) {
            this.habits[index] = { ...this.habits[index], ...habitData }
            return this.habits[index]
          }
          throw new Error('习惯不存在')
        } else {
          const data = await habitApi.updateHabit(id, habitData)
          const index = this.habits.findIndex(h => h.id === id)
          if (index !== -1) {
            this.habits[index] = data
          }
          return data
        }
      } catch (error) {
        console.warn('更新习惯失败，使用本地模式', error)
        // 如果API失败，切换到本地模式
        this.useLocalData = true
        const index = this.habits.findIndex(h => h.id === id)
        if (index !== -1) {
          this.habits[index] = { ...this.habits[index], ...habitData }
          return this.habits[index]
        }
        throw error
      }
    },

    async deleteHabit(id) {
      try {
        if (!this.useLocalData) {
          await habitApi.deleteHabit(id)
        }
        // 无论是否本地模式，都从数组中移除
        this.habits = this.habits.filter(h => h.id !== id)
      } catch (error) {
        console.warn('删除习惯失败，使用本地模式', error)
        // 如果API失败，切换到本地模式并仍然执行删除
        this.useLocalData = true
        this.habits = this.habits.filter(h => h.id !== id)
      }
    },

    async checkHabit(id) {
      try {
        if (this.useLocalData) {
          // 本地模式直接更新
          const index = this.habits.findIndex(h => h.id === id)
          if (index !== -1) {
            this.habits[index].checkedToday = true
            this.habits[index].streak += 1
            return this.habits[index]
          }
          throw new Error('习惯不存在')
        } else {
          const data = await habitApi.checkHabit(id)
          const index = this.habits.findIndex(h => h.id === id)
          if (index !== -1) {
            this.habits[index] = data
          }
          return data
        }
      } catch (error) {
        console.warn('打卡失败，使用本地模式', error)
        // 如果API失败，切换到本地模式
        this.useLocalData = true
        const index = this.habits.findIndex(h => h.id === id)
        if (index !== -1) {
          this.habits[index].checkedToday = true
          this.habits[index].streak += 1
          return this.habits[index]
        }
        throw error
      }
    }
  }
}) 